#ifndef TINY_MUDUO_THREAD_H_
#define TINY_MUDUO_THREAD_H_

#include <pthread.h>
#include<functional>

#include "latch.h"//C++20d的库函数中引入latch，这里自己写以适应低版本
/*
    latch即门闩门阀，也可以叫闭锁。
    闭锁是一种同步工具类，可以延迟线程的进度直到其到达终止状态。闭锁的作用相当于一扇门：在闭锁到达结束状态之前，这扇门一直是关闭的，并且没有
    任何线程能通过，当到达结束状态时，这扇门会打开并允许所有的线程通过。当闭锁到达结束状态后，将不会再改变状态，因此这扇门将永远保持打开状态。
    可以向CountDownLatch对象设置一个初始的数字作为计数值，任何调用这个对象上的await()方法都会阻塞，直到这个计数器的计数值被其他的线程减为0
    为止。 (countDown()函数每经过一个线程都会减一，直到减到0时锁打开)
*/

namespace tiny_muduo{
    class Thread{
        public:
            typedef std::function<void()> ThreadFunc;
            Thread(const ThreadFunc& func);
            ~Thread();

            void StartThread();

        private:
            pthread_t pthread_id_;
            ThreadFunc func_;
            Latch latch_;
    };

    struct ThreadData{
        typedef tiny_muduo::Thread::ThreadFunc ThreadFunc;
        ThreadFunc func_;
        Latch* latch_;

        ThreadData(ThreadFunc& func,Latch* latch)
            :func_(func),
             latch_(latch){

             }

        void RunOneFunc(){
            latch_->CountDown();
            latch_=nullptr;
            func_();
        }  
    }; 
}

#endif